STM32F407通过SPI+DMA的方式驱动WS2812 |
您所在的位置:网站首页 › stm32f407dma 串口与spi › STM32F407通过SPI+DMA的方式驱动WS2812 |
关于STM32F407通过SPI+DMA的方式驱动WS2812的讲解与驱动demo ws2812简介1、控制电路与RGB芯片集成在一个5050封装的元器件中, 构成一个完整的外控像素点。 2、每个像素点的三基色颜色可实现256级亮度显示, 完成16777216种颜色的全真色彩显示, 扫描频率不低于400Hz/s。 3、串行级联接口, 能通过一根信号线完成数据的接收与解码。 4、任意两点传传输距离在不超过5米时无需增加任何电路。 5、当刷新速率30帧/秒时, 低速模式级联数不小于512点, 高速模式不小于1024点。 6、数据发送速度可达800Kbps。 7、光的颜色高度一致, 性价比高。 ws2812这款灯珠使用起来真的很方便,可以变换很多种颜色。但是,区分度较为明显的颜色不是很多,很多的颜色通过灯珠表现出来后辨识度不高。一般只能用红、橙、黄、绿、蓝、靛、紫、白和洋红这几种辨识度比较高的颜色。 LED的参数特性如下: ws2812数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。 所谓的单线归零码,也称为单极性归零码,是指高电平和零电平分别表示二进制码1 和0,在无电压表示“0”,恒定正电压表示“1”,但持续时间短于一个码元的时间宽度,即发出一个窄脉冲。每个码元时间的中间点是采样时间,判决门限为半幅电平。 单极性归零码的主要优点是可以直接提取同步信号,因此单极性归零码常常用作其他码型提取同步信号时的过渡码型.也就是说其他适合信道传输但不能直接提取同步信号的码型,可先变换为单极性归零码,然后再提取同步信号。 它的具体体现如下图所示:
硬件SPI中有一个MOSI引脚来输出数据,我们就是用MOSI的输出功能,通过发送一个字节或半字的数据,来模拟我们的LED控制信号0码或码1,主要就是配置好SPI的时钟即可。看下图: 配置好SPI之后,就是DMA的配置了,为什么采用DMA呢。是因为每次调用SPI发送数据是有时间间隔的,并且会被中断打断,这时候DMA的作用就体现出来了。将DMA的内存地址设置为SIP待发送数据的地址,长度设置为发送数据的大小,然后开启DMA发送,等待DMA发送完成标志位置位即可。下面是DMA的配置部分: DMA_InitStructure.DMA_Channel = DMA_Channel_0; //通道选择 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR; //DMA外设地址 DMA_InitStructure.DMA_Memory0BaseAddr = (u32)pixelBuffer; //DMA 存储器0地址 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //存储器到外设模式 DMA_InitStructure.DMA_BufferSize = Pixel_S1_NUM * 24; //数据传输量 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设非增量模式 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器增量模式 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据长度:8位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //存储器数据长度:8位 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 使用普通模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //中等优先级 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //存储器突发单次传输 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //外设突发单次传输 DMA_Init(DMA1_Stream4, &DMA_InitStructure); //初始化DMA StreamSPI和DMA的配置就已经结束了,接下来便是数据的转换了。数据转换主要涉及将RGB转换为LED能识别的信号。下图是数据的传输方式: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |